【C】按字符串长度排序

按字符串长度排序可以分为以下三个步骤:

  1. 读取所有输入行

  2. 对文本进行排序

  3. 按次序打印文本行

代码如下:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAXLEN 1000
char *alloc(int);
int getline(char *p,int n);//读取一行字符
int readline(char *lineptr[],int maxlines);//读取所有输入行
void qsort(char *lineptr[],int left,int right);//对字符串进行排序
void writeline(char *lineptr[],int lines);//打印
void swap(char *lineptr[],int i,int j);//交换指针
int main()
{
    char *p[100];
    int i;
    i = readline(p,100);

    //swap(p,0,1);
    qsort(p,0,i-1);
    writeline(p,i);
    //printf("%s",p[1]);
    printf("%d\n",i);   
    return 0;
} 
int getline(char s[],int n)
{
    int i;
    int c;
    for(i=0;i<n-1&&(c=getchar())!='\n'&&c!=EOF;i++)
        s[i]=c;
    if(c=='\n')
    {
        s[i]=c;
        i++;
    }
    s[i] ='\0'; 
    return  i;
}
int readline(char *lineptr[],int maxlines)
{
    int len,nlines;
    char *p;
    char line[MAXLEN];
    nlines = 0;
    while((len = getline(line,MAXLEN)) >0 )
        if(nlines >= maxlines || (p = (char*)malloc(len)) == NULL)  //p=alloc[len]ÉêÇëÄÚ´æ¿Õ¼ä 
            return -1;
        else
        {
            line[len-1]='\0';       //ɾ³ýÁË»»Ðзû
            strcpy(p,line);
            lineptr[nlines++] = p;
        }
    return nlines;  
}

void writeline(char *lineptr[],int lines)
{
    int i=0;
    for(i=0;i<lines;i++)
        printf("%s\n",lineptr[i]);
}

void qsort(char *lineptr[],int left,int right)
{

    int i,last; 
    if(left>=right)
        return ;
    swap(lineptr,left,(left+right)/2);
    last = left;
    for(i=left+1;i<=right;i++)
        //if(strcmp(lineptr[i],lineptr[left])<0)    
        if(strlen(lineptr[i])<strlen(lineptr[left]))//比较字符串长度
            swap(lineptr,++last,i);

    swap(lineptr,left,last);
    qsort(lineptr,left,last-1);
    qsort(lineptr,last+1,right);
}
void swap(char *lineptr[],int i,int j)
{
    char *temp;
    temp = lineptr[i];
    lineptr[i]=lineptr[j];
    lineptr[j] = temp;
}

运行结果:
这里写图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值